package com.base.commom.pwd;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * md5加密工具
 * 
 * @author chenwei
 * @date 2018年4月28日 下午3:03:48
 */
public final class Md5Utils {
	
	private final static String MD5 = "MD5";
	private final static String SHA1 = "SHA1";
	private static MessageDigest _mdInst = null;
	private final static char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
			'f' };

	/**
	 * 生成 MD5
	 *
	 * @param data
	 *            待处理数据
	 * @return MD5结果
	 */
	public static String MD5(String data) throws Exception {
		java.security.MessageDigest md = MessageDigest.getInstance("MD5");
		byte[] array = md.digest(data.getBytes("UTF-8"));
		StringBuilder sb = new StringBuilder();
		for (byte item : array) {
			sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
		}
		return sb.toString().toUpperCase();
	}

	/**
	 * 数据+盐 生成MD5
	 * 
	 * @param data
	 *            数据
	 * @param salt
	 *            盐
	 * @return
	 * @throws Exception
	 */
	public static String MD5AddSalt(String data, String salt) throws Exception {
		data = MD5(data);
		salt = MD5(salt);
		return MD5(data + salt);
	}
	/**
	 * 加密方式
	 * 
	 * @author chenwei
	 * @date 2018年5月3日 下午3:04:16
	 * @param algorithm 加密方式 SHA1,MD5
	 * @param str 加密数据
	 * @return
	 */
	public static String encode(String algorithm, String str) {

		if (str == null) {
			return null;
		}
		try {
			MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
			messageDigest.update(str.getBytes());
			return getFormattedText(messageDigest.digest());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}
	
	/**
     * 快递100生成 MD5
     * @author gujiahua
     * 2018年11月1日 上午11:43:26
     * @param s 待处理数据
     * @return MD5结果
     */
	public final static String encode(String s) {
		try {
			byte[] btInput = s.getBytes();
			// 使用指定的字节更新摘要
			getMdInst().update(btInput);
			// 获得密文
			byte[] md = getMdInst().digest();
			// 把密文转换成十六进制的字符串形式
			int j = md.length;
			char str[] = new char[j * 2];
			int k = 0;
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	

	private static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
			'F' };
	// 获得MD5摘要算法的 MessageDigest 对象
	private static MessageDigest getMdInst() {
		if (_mdInst == null) {
			try {
				_mdInst = MessageDigest.getInstance("MD5");
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			}
		}
		return _mdInst;
	}
	/**
	 * 数据+盐 生成MD5
	 * 
	 * @author chenwei
	 * @date 2018年5月3日 下午3:01:50
	 * @param password 密码
	 * @param salt 盐
	 * @return
	 */
	public static String MD5AddSalt2(String password, String salt) {
		String passwordSHA1 = encode(SHA1, password);
		String password_salt = encode(SHA1, passwordSHA1 + salt);
		return password_salt;
	}

	/**
     * 密码加密工具
     * @param password 密码
     * @param salt 用户的登录名loginName
     * @return
     */
    public static  String getPassword(String password,String salt){
        String passwordSHA1 = encode(SHA1, password);
        String password_salt = encode(SHA1, passwordSHA1+salt);
        return password_salt;
    }
    
    /**
     * Takes the raw bytes from the digest and formats them correct.
     * 
     * @param bytes
     *            the raw bytes from the digest.
     * @return the formatted bytes.
     */
    private static String getFormattedText(byte[] bytes) {

        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文转换成十六进制的字符串形式
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] << 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }
    
    /**
	 * 获取该文件数据的MD5密码
	 * 
	 * @author chenwei
	 * @date 2019年2月15日 下午6:25:51
	 * @param byteFiles 文件字节数据
	 * @throws Exception
	 */
	public static String getFileMd5(byte[] byteFiles) throws Exception {
		MessageDigest messageDigest = MessageDigest.getInstance(MD5);
		messageDigest.update(byteFiles, 0, byteFiles.length);
		return new BigInteger(1, messageDigest.digest()).toString(16);
	}
//	public static void main(String[] args) {
//		System.out.println(getPassword("kooun888888","13250543128"));
//	}

}
